package br.sddp.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.TypedQuery;

import br.sddp.modelo.Duvida;
import br.sddp.util.JPAUtil;
import br.sddp.util.TratadorExceptions;

public class DuvidaDAO extends GenericDAO {

	/**
	 * Metodo que realiza uma consulta na base de dados em busca 
	 * das duvidas que nao foram respondidas.
	 * 
	 * @return - Lista contendo todas as duvidas nao respondidas.
	 */
	public List<Duvida> listarDuvidas () {
		
		List<Duvida> retorno = new ArrayList<Duvida>();
		
		em = new JPAUtil().getEntityManager();
		
		try {
			em.getTransaction().begin();
			TypedQuery<Duvida> query = em.createNamedQuery("Duvida.FindAll", Duvida.class);
			retorno = query.getResultList();			
		}
		catch (Exception e) {
			em.getTransaction().rollback();
			TratadorExceptions.tratarExceptionsGerais(e);
		}
		finally {
			em.close();
		}
		
		return retorno;
	}
	
	/**
	 * Metodo que recupera do banco de dados todas as duvidas ja respondidas.
	 * 
	 * @return Uma lista com todos os registros
	 */
	public List<Duvida> listarRespondidas() {
		
		List<Duvida> retorno = new ArrayList<Duvida>();
		
		em = new JPAUtil().getEntityManager();
		
		try {
			em.getTransaction().begin();
			TypedQuery<Duvida> query = em.createNamedQuery("Duvida.Respondidas", Duvida.class);
			retorno = query.getResultList();
		}
		
		catch (Exception e) {
			TratadorExceptions.tratarExceptionsGerais(e);
			em.getTransaction().rollback();
		}
		
		finally {
			em.close();
		}
		
		return retorno;
	}
	
	/**
	 * Metodo que recupera do banco de dados todas as duvidas ja respondidas.
	 * 
	 * @return Uma lista com todos os registros
	 */
	public List<Duvida> listarNaoRespondidas() {
		
		List<Duvida> retorno = new ArrayList<Duvida>();
		
		em = new JPAUtil().getEntityManager();
		
		try {
			em.getTransaction().begin();
			TypedQuery<Duvida> query = em.createNamedQuery("Duvida.NaoRespondidas", Duvida.class);
			retorno = query.getResultList();
		}
		
		catch (Exception e) {
			TratadorExceptions.tratarExceptionsGerais(e);
			em.getTransaction().rollback();
		}
		
		finally {
			em.close();
		}
		
		return retorno;
	}
	
	/**
	 * Busca uma duvida utilizando um id.
	 * 
	 * @param id
	 * @return A duvida que possui o id informado.
	 */
	public Duvida buscar(Long id) {
		
		Duvida duvida = null;
		em = new JPAUtil().getEntityManager();
		
		try {
			em.getTransaction().begin();
			TypedQuery<Duvida> query = em.createQuery("SELECT d FROM Duvida d WHERE d.idDuvida = :id", Duvida.class);
			query.setParameter("id", id);
			duvida = query.getSingleResult();
		}
		
		catch (Exception e) {
			TratadorExceptions.tratarExceptionsGerais(e);
		}
		
		finally {
			em.close();
		}
		
		return duvida;
	}
	
	/**
	 * Metodo que recupera do banco de dados todas as duvidas respondidas de
	 * determinado usuario.
	 * 
	 * @param id
	 * @return
	 */
	public List<Duvida> listarRespondidasPorUsuario(long id) {
		
		List<Duvida> duvidas = new ArrayList<Duvida>();
		
		em = new JPAUtil().getEntityManager();
		
		try {
			em.getTransaction().begin();			
			TypedQuery<Duvida> query = em.createQuery("SELECT d FROM Duvida d WHERE Professor_idUsuario =:idUsuario AND status = true", Duvida.class);
			query.setParameter("idUsuario", id);		
			duvidas = query.getResultList();
		}
		catch (Exception e) {
			TratadorExceptions.tratarExceptionsGerais(e);			
		}
		finally {
			em.close();
		}
		
		return duvidas;
		
	}
	
	/**
	 * Metodo que recupera do banco de dados todas as duvidas em aberto postadas por
	 * determinado usuario.
	 * 
	 * @param id
	 * @return
	 */
	public List<Duvida> listarNaoRespondidasPorUsuario(long id) {
		
		List<Duvida> duvidas = new ArrayList<Duvida>();
		
		em = new JPAUtil().getEntityManager();
		
		try {
			em.getTransaction().begin();			
			TypedQuery<Duvida> query = em.createQuery("SELECT d FROM Duvida d WHERE Professor_idUsuario =:idUsuario AND status = false", Duvida.class);
			query.setParameter("idUsuario", id);		
			duvidas = query.getResultList();
		}
		catch (Exception e) {
			TratadorExceptions.tratarExceptionsGerais(e);			
		}
		finally {
			em.close();
		}
		
		return duvidas;
		
	}
}
